#ifndef __MY_JSONUTIL__
#define __MY_JSONUTIL__
#include <iostream>
#include <string>
#include "log.hpp"
#include <jsoncpp/json/json.h>
#include "./mylib/include/bundle.h"
namespace cloudBackup
{
    class JsonUtil
    {
    public:
        // json对象序列化成字符串str
        static bool Serialize(const Json::Value &root, std::string *str)
        {
            Json::StreamWriterBuilder swb;
            std::unique_ptr<Json::StreamWriter> swPtr(swb.newStreamWriter());
            std::stringstream ss;
            // virtual int write(const Value &root, ostream *sout)
            // 按照子类中的配置将值写入文档 json对象写到ss-buffer
            if (swPtr->write(root, &ss) != 0)
            {
                Log::log(LOGERROR, "JsonUtil::Serialize::swPtr->write() failed !: %s: %d", strerror(errno), errno);
                return false;
            }
            *str = ss.str();
            return true;
        }

        // 字符串反序列化成json对象
        static bool Deserialize(const std::string &str, Json::Value *root)
        {
            if(str.empty())
            {
                Log::log(INFO, "JsonUtil::DeSerialize::no data need transfer!");
                return false;
            }

            Json::CharReaderBuilder crb;
            std::unique_ptr<Json::CharReader> crPtr(crb.newCharReader());

            std::string err;
            // bool parse(const char *beginDoc, const char *endDoc, Value *root, string *errs)
            // 从一个字符序列中解析存储在Value对象中 将错误信息存储在string类型的对象中
            bool parseOK = crPtr->parse(str.c_str(), str.c_str() + str.size(), root, &err);
            if (parseOK == false)
            {
                Log::log(LOGERROR, "JsonUtil::DeSerialize::crPtr->parse() failed !: %s: %d", err.c_str(), errno);
                return false;
            }
            return true;
        }
    };
}
#endif // __MY_JSONUTIL__